import axios from 'axios'

let api_base_url = ''
if (process.env.NODE_ENV === 'development') {
  // 开发环境
  // api_base_url = 'https://26461uv599.oicp.vip'
  api_base_url = 'http://127.0.0.1:4600'
  // api_base_url = 'http://192.168.10.139:4600'
  // api_base_url = 'http://127.0.0.1:5000'
} else if (import.meta.env.NODE_ENV === 'production') {
  // 生产环境
  api_base_url = '/'
} else {
  api_base_url = '/'
}
// dsada
/*  防止请求重复
1. 我们需要对所有正在进行中的请求进行缓存。在请求发起前判断缓存列表中该请求是否正在进行，如果有则取消本次请求。
2.在任意请求完成后，需要在缓存列表中删除该次请求，以便可以重新发送该请求
*/

//正在请求的API队列
let requestList = []
/**
 * @name:  阻止请求
 * @param {array} requestList 当前API请求队列
 * @param {string} currentUrl  当前请求API
 * @param {function} cancelFn  请求中断函数
 * @param {string} errorMsg   中断错误信息
 */
const stopRepeatRequest = (requestList, currentUrl, cancelFn, errorMsg) => {
  const errorMessage = errorMsg || '请求出错拥堵'
  for (let i = 0; i < requestList.length; i++) {
    if (requestList[i] === currentUrl) {
      cancelFn(errorMessage)
      return
    }
  }
  // 将当前请求加入执行队列
  requestList.push(currentUrl)
}
/**
 * @name:  请求完成后从队列删除当前请求
 * @param {array} requestList 当前API请求队列
 * @param {string} currentUrl  当前请求API
 */
const allowRequest = (requestList, currentUrl) => {
  for (let i = 0; i < requestList.length; i++) {
    if (requestList[i] === currentUrl) {
      requestList.splice(i, 1)
      break
    }
  }
}

let instance = axios.create({
  timeout: 1000 * 80,
  baseURL: api_base_url,
})
instance.defaults.headers.common['Access-Control-Allow-Origin'] = '*'
instance.defaults.responseType = 'json'

instance.defaults.validateStatus = function () {
  // return status >= 200 && status < 400; // 200- 399  resolve  其他状态码 reject
  // 如果在响应拦截设置了状态码判断，这里设置返回 true
  return true
}
// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 设置cancelToken
    let cancelFn = null
    config.cancelToken = new axios.CancelToken(function (c) {
      cancelFn = c
    })
    
    // while(true) {
    //   console.log('进入等待')
    //   console.log(sessionStorage.getItem("online_id"),'===',sessionStorage.getItem("user_id"))
    //   if (sessionStorage.getItem("online_id")==null && sessionStorage.getItem("user_id")) {
    //     console.log('进入等待1')
    //     new Promise((resolve) => setTimeout(resolve, 1000))
    //   }
    //   else {
    //     break
    //   }
    // }
      //     if (sessionStorage.getItem("online_id")==null && sessionStorage.getItem("user_id")) {
      //   console.log('进入等待1')
      //   new Promise((resolve) => setTimeout(resolve, 1000))
      // }
    let exitonline = true
    if(sessionStorage.getItem("online_id")==null) {
      exitonline = false
    }
    // config.headers.token = 'flask-jwt ' + sessionStorage.getItem("token")
    config.headers.token = sessionStorage.getItem("token")
    config.headers.onlineid = sessionStorage.getItem("online_id")
    config.headers.exitonline = exitonline
    return config
  },
  (error) => {
    Message.error({ message: '请求超时!' })
    return Promise.reject(error)
  }
)
// 响应拦截器即异常处理
// 服务器 Response 对象
instance.interceptors.response.use(
  (response) => {
    //不得重复发送
    setTimeout(() => {
      allowRequest(requestList, response.config.url), 1000
    })
    // {data: {…}, status: 200, statusText: "OK", headers: {…}, config: {…}, request:{…}}
    let data = response.data //响应的数据部分(服务器返回部分)
    let status = response.status //标准状态码
    if (status === 200) {
      console.log('返回客户端200')
      return Promise.resolve({ status: status, data: data })
    } else if (status === 201) {
      console.log('返回客户端201')
      return Promise.resolve({ status: status, data: data })
    } else if (status === 202) {
      console.log('返回客户端202')
      ElMessage.error(data.msg)
      return Promise.resolve({ status: status, data: data })
    } else if (status === 204) {
      console.log('204操作成功')
      return
    } else if (status >= 400 && status <= 499) {
      console.log('客户端请求错误')
      console.log(response)
      if (data.msg){
        ElMessage.error(data.msg)
      } else if(data.message) {
        ElMessage.error(data.message)
      } else {
        ElMessage.error(data[Object.keys(data)[0]])
      }
       
      return Promise.resolve({ status: status })
    } else {
      console.log('其他错误')
      ElMessage.error(data[Object.keys(data)[0]])
      return Promise.resolve({ status: status })
    }
  },
  (error) => {
    // 对响应错误做点什么
		if (error.message.indexOf('timeout') != -1) {
			ElMessage.error('网络超时');
		} else if (error.message == 'Network Error') {
			ElMessage.error('网络连接错误');
		} else {
			if (error.response.data) ElMessage.error(error.response.statusText);
			else ElMessage.error('接口路径找不到');
		}

    return Promise.resolve({ status: 500 }) 
  }
)
let api = instance

export default api
